﻿using System;
using System.Collections.Generic;
using System.Text;
//
using System.Runtime.InteropServices;


namespace FileLib
{
    /*
     *  INI文件其实是一种具有特定结构的文本文件，它的构成分为三部分，结构如下：
     *  [Section1]
     *  key1 = value2
     *  key1 = value2
     *  ……
     *  [Section2]
     *  key1 = value1
     *  key2 = value2
     *  ……
     */
    /// <summary>
    /// INI 文件操作
    /// </summary>
    public class INIOperation
    {
        #region 声明

        /* 读操作
         * section：要读取的段落名
         * key: 要读取的键
         * defVal: 读取异常的情况下的缺省值
         * retVal: key 所对应的值，如果该 key 不存在则返回空值
         * size: 值允许的大小
         * filePath: INI文件的完整路径和文件名
         */
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);


        /* 写操作：
         * section: 要写入的段落名
         * key: 要写入的键，如果该 key 存在则覆盖写入
         * val: key 所对应的值
         * filePath: INI 文件的完整路径和文件名  
         */
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

        #endregion

        #region 方法

        /// <summary>
        /// 写 INI 文件
        /// </summary>
        /// <param name="section">段落</param>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="iniPath">ini 路径</param>
        /// <returns></returns>
        public long WriteValue(string section, string key, string value, string iniPath)
        {
            if (string.IsNullOrWhiteSpace(section) ||
                string.IsNullOrWhiteSpace(key) ||
                string.IsNullOrWhiteSpace(iniPath))
                return -1L;

            return WritePrivateProfileString(section, key, value, iniPath);
        }

        /// <summary>
        /// 读 INI 文件
        /// </summary>
        /// <param name="section">段落</param>
        /// <param name="key">键</param>
        /// <param name="iniPath">ini 路径</param>
        /// <param name="valueLength">键值长度</param>
        /// <returns>返回键值</returns>
        public string ReadValue(string section, string key, string iniPath, out int valueLength)
        {
            valueLength = -1;
            if (string.IsNullOrWhiteSpace(section) ||
                string.IsNullOrWhiteSpace(key) ||
                string.IsNullOrWhiteSpace(iniPath))
                return string.Empty;

            StringBuilder value = new StringBuilder();
            valueLength = GetPrivateProfileString(section, key, string.Empty, value, 255, iniPath);
            return value.ToString();
        }

        #endregion
    }
}
